home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 22 / Cream of the Crop 22.iso / doom / quake1.zip / SPREDGUN.ZIP / SPREDGUN.QC < prev    next >
Text File  |  1996-08-12  |  20KB  |  683 lines

  1. /*
  2. ==============================================================================
  3.  
  4. BEGINING CRAP
  5.  
  6. ==============================================================================
  7. */
  8.  
  9. void() W_ChangeWeapon;
  10. void() W_SetCurrentAmmo;
  11.  
  12. void()   HomeThink;
  13. entity() HomeFindTarget;
  14. float(entity targ) visible;
  15. float(entity targ) infront;
  16.  
  17. void()  s_spreadexplode1      =       [0,             s_spreadexplode2] {};
  18. void()  s_spreadexplode2      =       [1,             s_spreadexplode3] {};
  19. void()  s_spreadexplode3      =       [2,             s_spreadexplode4] {};
  20. void()  s_spreadexplode4      =       [3,             s_spreadexplode5] {};
  21. void()  s_spreadexplode5      =       [4,             s_spreadexplode6] {};
  22. void()  s_spreadexplode6      =       [5,             SUB_Remove] {};
  23.  
  24. /*
  25. ==============================================================================
  26.  
  27. DOG ROCKET
  28.  
  29. ==============================================================================
  30. */
  31.  
  32. vector(float dm) DogVelocityForDamage =
  33. {
  34.     local vector v;
  35.  
  36.         v_x = 100 * random();
  37.         v_y = 100 * random();
  38.     v_z = 200 + 100 * random();
  39.  
  40.     if (dm > -50)
  41.     {
  42. //        dprint ("level 1\n");
  43.         v = v * 0.7;
  44.     }
  45.     else if (dm > -200)
  46.     {
  47. //        dprint ("level 3\n");
  48.         v = v * 2;
  49.     }
  50.     else
  51.         v = v * 10;
  52.  
  53.     return v;
  54. };
  55.  
  56.  
  57. void(string gibname, float dm) DogGib =
  58. {
  59.     local    entity new;
  60.  
  61.     new = spawn();
  62.     new.origin = self.origin;
  63.     setmodel (new, gibname);
  64.     setsize (new, '0 0 0', '0 0 0');
  65.         new.velocity = DogVelocityForDamage (dm);
  66.     new.movetype = MOVETYPE_BOUNCE;
  67.     new.solid = SOLID_NOT;
  68.     new.avelocity_x = random()*600;
  69.     new.avelocity_y = random()*600;
  70.     new.avelocity_z = random()*600;
  71.     new.think = SUB_Remove;
  72.     new.ltime = time;
  73.     new.nextthink = time + 10 + random()*10;
  74.     new.frame = 0;
  75.     new.flags = 0;
  76. };
  77.  
  78.  
  79.  
  80.  
  81. void() DogBecomeExplosion =
  82. {
  83.         sound (self, CHAN_WEAPON, "dog/dattack1.wav", 1, ATTN_NORM);
  84.     self.movetype = MOVETYPE_NONE;
  85.     self.velocity = '0 0 0';
  86.     self.touch = SUB_Null;
  87.         setmodel (self, "progs/s_explod.spr");
  88.     self.solid = SOLID_NOT;
  89.         s_spreadexplode1();
  90.         DogGib ("progs/gib1.mdl",100);
  91.         DogGib ("progs/gib2.mdl",100);
  92.         DogGib ("progs/gib3.mdl",100);
  93. };
  94.  
  95. void() T_DogTouch =
  96. {
  97.     local float    damg;
  98.  
  99.                 if (other == self.owner)
  100.         return;        // don't explode on owner
  101.  
  102.     if (pointcontents(self.origin) == CONTENT_SKY)
  103.     {
  104.         remove(self);
  105.         return;
  106.     }
  107.  
  108. //        damg = 100 + random()*20;  Previous value
  109.           damg = 10;
  110.         
  111.     if (other.health)
  112.     {
  113.         T_Damage (other, self, self.owner, damg );
  114.     }
  115.  
  116.     // don't do radius damage to the other, because all the damage
  117.     // was done in the impact
  118. //        T_RadiusDamage (self, self.owner, 120, other);
  119.  
  120. //    sound (self, CHAN_WEAPON, "weapons/r_exp3.wav", 1, ATTN_NORM);
  121.     self.origin = self.origin - 8*normalize(self.velocity);
  122.  
  123.     WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
  124.     WriteByte (MSG_BROADCAST, TE_EXPLOSION);
  125.     WriteCoord (MSG_BROADCAST, self.origin_x);
  126.     WriteCoord (MSG_BROADCAST, self.origin_y);
  127.     WriteCoord (MSG_BROADCAST, self.origin_z);
  128.  
  129.         DogBecomeExplosion();
  130. };
  131.  
  132.  
  133.  
  134.  
  135. void() W_FireDog =
  136. {
  137.     local    entity missile, mpuff;
  138.  
  139.   //      self.currentammo = self.ammo_rockets = self.ammo_rockets - 1;
  140.     
  141.     sound (self, CHAN_WEAPON, "weapons/sgun1.wav", 1, ATTN_NORM);
  142.  
  143.     self.punchangle_x = -2;
  144.  
  145.     missile = spawn ();
  146.     missile.owner = self;
  147.     missile.movetype = MOVETYPE_FLYMISSILE;
  148.     missile.solid = SOLID_BBOX;
  149.         
  150. // set missile speed    
  151.  
  152.     makevectors (self.v_angle);
  153.     missile.velocity = aim(self, 1000);
  154.     missile.velocity = missile.velocity * 1000;
  155.     missile.angles = vectoangles(missile.velocity);
  156.     
  157.         missile.touch = T_DogTouch;
  158.     
  159. // set missile duration
  160. //        missile.nextthink = time + 30;
  161. //        missile.think = SUB_Remove;
  162.         missile.nextthink = time + 0.2;  //HOMING CODE!!!!
  163.         missile.think = HomeThink;
  164.         missile.enemy = world;
  165.         setmodel (missile, "progs/dog.mdl");
  166.     setsize (missile, '0 0 0', '0 0 0');        
  167.     setorigin (missile, self.origin + v_forward*8 + '0 0 16');
  168. };
  169.  
  170.  
  171. /*
  172. ==============================================================================
  173.  
  174. CONTRA SPREAD GUN
  175.  
  176. ==============================================================================
  177. */
  178.  
  179. void() SpreadBecomeExplosion =
  180. {
  181.     self.movetype = MOVETYPE_NONE;
  182.     self.velocity = '0 0 0';
  183.     self.touch = SUB_Null;
  184.         setmodel (self, "progs/s_explod.spr");
  185.     self.solid = SOLID_NOT;
  186.         s_spreadexplode1();
  187. };
  188.  
  189. void() T_SpreadTouch =
  190. {
  191.     local float    damg;
  192.  
  193.     if (other == self.owner)
  194.         return;        // don't explode on owner
  195.  
  196.     if (pointcontents(self.origin) == CONTENT_SKY)
  197.     {
  198.         remove(self);
  199.         return;
  200.     }
  201.  
  202. //        damg = 100 + random()*20;  Previous value
  203.           damg = 40 + random()*20;  //Previous value
  204.  
  205.     if (other.health)
  206.     {
  207.         T_Damage (other, self, self.owner, damg );
  208.     }
  209.  
  210.     // don't do radius damage to the other, because all the damage
  211.     // was done in the impact
  212.        // T_RadiusDamage (self, self.owner, 120, other);
  213.  
  214. //    sound (self, CHAN_WEAPON, "weapons/r_exp3.wav", 1, ATTN_NORM);
  215.     self.origin = self.origin - 8*normalize(self.velocity);
  216.  
  217.     WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
  218.     WriteByte (MSG_BROADCAST, TE_EXPLOSION);
  219.     WriteCoord (MSG_BROADCAST, self.origin_x);
  220.     WriteCoord (MSG_BROADCAST, self.origin_y);
  221.     WriteCoord (MSG_BROADCAST, self.origin_z);
  222.  
  223.         SpreadBecomeExplosion ();
  224. };
  225.  
  226. void() W_FireSpread =
  227. {
  228.         local   entity missile1, mpuff;
  229.         local   entity missile2, mpuff;
  230.         local   entity missile3, mpuff;
  231.         local   entity missile4, mpuff;
  232.         local   entity missile5, mpuff;
  233.  
  234.     if (self.ammo_cells < 1)
  235.     {
  236.                 sprint(self, "Cells Needed to Fire Spread Gun\n");
  237.         self.weapon = W_BestWeapon ();
  238.         W_SetCurrentAmmo ();
  239.         return;
  240.     }
  241.  
  242.         self.currentammo = self.ammo_cells = self.ammo_cells - 5;
  243.         if(self.ammo_cells < 0) {self.ammo_cells=0;}
  244.     
  245.         sound (self, CHAN_WEAPON, "weapons/spredgun.wav", 1, ATTN_NORM);
  246.  
  247.     self.punchangle_x = -2;
  248.  
  249.         missile1 = spawn ();
  250.         missile1.owner = self;
  251.         missile1.movetype = MOVETYPE_FLYMISSILE;
  252.         missile1.solid = SOLID_BBOX;
  253.  
  254.         missile2 = spawn ();
  255.         missile2.owner = self;
  256.         missile2.movetype = MOVETYPE_FLYMISSILE;
  257.         missile2.solid = SOLID_BBOX;
  258.  
  259.         missile3 = spawn ();
  260.         missile3.owner = self;
  261.         missile3.movetype = MOVETYPE_FLYMISSILE;
  262.         missile3.solid = SOLID_BBOX;
  263.  
  264.         missile4 = spawn ();
  265.         missile4.owner = self;
  266.         missile4.movetype = MOVETYPE_FLYMISSILE;
  267.         missile4.solid = SOLID_BBOX;
  268.  
  269.         missile5 = spawn ();
  270.         missile5.owner = self;
  271.         missile5.movetype = MOVETYPE_FLYMISSILE;
  272.         missile5.solid = SOLID_BBOX;
  273.  
  274.  
  275.  
  276. // set missile speed    
  277.  
  278.         makevectors (self.v_angle);
  279.         missile1.velocity = aim(self, 1000);
  280.         missile1.velocity = missile1.velocity * 1000;  
  281.         missile1.angles = vectoangles(missile1.velocity);
  282.         missile1.touch = T_SpreadTouch;
  283.  
  284.         makevectors (self.v_angle + '0 11 0');
  285.         missile2.velocity = aim(self, 1000);
  286.         missile2.velocity = missile2.velocity * 1000;  
  287.         missile2.angles = vectoangles(missile2.velocity);
  288.         missile2.touch = T_SpreadTouch;
  289.  
  290.         makevectors (self.v_angle + '0 -11 0');
  291.         missile3.velocity = aim(self, 1000);
  292.         missile3.velocity = missile3.velocity * 1000; 
  293.         missile3.angles = vectoangles(missile3.velocity);
  294.         missile3.touch = T_SpreadTouch;
  295.  
  296.         makevectors (self.v_angle + '0 22 0');
  297.         missile4.velocity = aim(self, 1000);
  298.         missile4.velocity = missile4.velocity * 1000;  
  299.         missile4.angles = vectoangles(missile4.velocity);
  300.         missile4.touch = T_SpreadTouch;
  301.  
  302.         makevectors (self.v_angle + '0 -22 0');
  303.         missile5.velocity = aim(self, 1000);
  304.         missile5.velocity = missile5.velocity * 1000; 
  305.         missile5.angles = vectoangles(missile5.velocity);
  306.         missile5.touch = T_SpreadTouch;
  307.  
  308.  
  309. // set missile duration
  310.         missile1.nextthink = time + 5; // number is # of secs missle lasts
  311.         missile1.think = SUB_Remove;
  312. //      missile1.nextthink = time + 0.2;
  313. //      missile1.think = HomeThink;
  314. //      missile1.enemy = world;
  315.         setmodel (missile1, "progs/spredgun.mdl");
  316.         setsize (missile1, '0 0 0', '0 0 0');     
  317.         setorigin (missile1, self.origin + v_forward*8 + '0 0 16');
  318.  
  319.  
  320.         missile2.nextthink = time + 5; // number is # of secs missle lasts
  321.         missile2.think = SUB_Remove;
  322. //      missile2.nextthink = time + 0.2;
  323. //      missile2.think = HomeThink;
  324. //      missile2.enemy = world;
  325.         setmodel (missile2, "progs/spredgun.mdl");
  326.         setsize (missile2, '0 0 0', '0 0 0');     
  327.         setorigin (missile2, self.origin + v_forward*8 + '0 0 16');//16
  328.  
  329.  
  330.         missile3.nextthink = time + 5; // number is # of secs missle lasts
  331.         missile3.think = SUB_Remove;
  332. //      missile3.nextthink = time + 0.2;
  333. //      missile3.think = HomeThink;
  334. //      missile3.enemy = world;
  335.         setmodel (missile3, "progs/spredgun.mdl");
  336.         setsize (missile3, '0 0 0', '0 0 0');     
  337.         setorigin (missile3, self.origin + v_forward*8 + '0 0 16'); //16
  338.  
  339.         missile4.nextthink = time + 5; // number is # of secs missle lasts
  340.         missile4.think = SUB_Remove;
  341. //      missile4.nextthink = time + 0.2;
  342. //      missile4.think = HomeThink;
  343. //      missile4.enemy = world;
  344.         setmodel (missile4, "progs/spredgun.mdl");
  345.         setsize (missile4, '0 0 0', '0 0 0');     
  346.         setorigin (missile4, self.origin + v_forward*8 + '0 0 16');//16
  347.  
  348.  
  349.         missile5.nextthink = time + 5; // number is # of secs missle lasts
  350.         missile5.think = SUB_Remove;
  351. //      missile5.nextthink = time + 0.2;
  352. //      missile5.think = HomeThink;
  353. //      missile5.enemy = world;
  354.         setmodel (missile5, "progs/spredgun.mdl");
  355.         setsize (missile5, '0 0 0', '0 0 0');     
  356.         setorigin (missile5, self.origin + v_forward*8 + '0 0 16'); //16
  357.  
  358.  
  359. };
  360. /*
  361. ==============================================================================
  362.  
  363. CONTRA HOMING SPREAD GUN
  364.  
  365. ==============================================================================
  366. */
  367.  
  368. void() HomeSpreadBecomeExplosion =
  369. {
  370.     self.movetype = MOVETYPE_NONE;
  371.     self.velocity = '0 0 0';
  372.     self.touch = SUB_Null;
  373.         setmodel (self, "progs/s_explod.spr");
  374.     self.solid = SOLID_NOT;
  375.         s_spreadexplode1();
  376. };
  377.  
  378. void() T_HomeSpreadTouch =
  379. {
  380.     local float    damg;
  381.  
  382.     if (other == self.owner)
  383.         return;        // don't explode on owner
  384.  
  385.     if (pointcontents(self.origin) == CONTENT_SKY)
  386.     {
  387.         remove(self);
  388.         return;
  389.     }
  390.  
  391. //        damg = 100 + random()*20;  Previous value
  392.           damg = 40 + random()*20;  //Previous value
  393.  
  394.     if (other.health)
  395.     {
  396.         T_Damage (other, self, self.owner, damg );
  397.     }
  398.  
  399.     // don't do radius damage to the other, because all the damage
  400.     // was done in the impact
  401.        // T_RadiusDamage (self, self.owner, 120, other);
  402.  
  403. //    sound (self, CHAN_WEAPON, "weapons/r_exp3.wav", 1, ATTN_NORM);
  404.     self.origin = self.origin - 8*normalize(self.velocity);
  405.  
  406.     WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
  407.     WriteByte (MSG_BROADCAST, TE_EXPLOSION);
  408.     WriteCoord (MSG_BROADCAST, self.origin_x);
  409.     WriteCoord (MSG_BROADCAST, self.origin_y);
  410.     WriteCoord (MSG_BROADCAST, self.origin_z);
  411.  
  412.         HomeSpreadBecomeExplosion ();
  413. };
  414.  
  415. void() W_FireHomeSpread =
  416. {
  417.         local   entity missile1, mpuff;
  418.         local   entity missile2, mpuff;
  419.         local   entity missile3, mpuff;
  420.         local   entity missile4, mpuff;
  421.         local   entity missile5, mpuff;
  422.  
  423.     if (self.ammo_cells < 1)
  424.     {
  425.                 sprint(self, "Cells Needed to Fire Homing Spread Gun\n");
  426.         self.weapon = W_BestWeapon ();
  427.         W_SetCurrentAmmo ();
  428.         return;
  429.     }
  430.  
  431.         self.currentammo = self.ammo_cells = self.ammo_cells - 25;
  432.         if(self.ammo_cells < 0) {self.ammo_cells=0;}
  433.  
  434.         sound (self, CHAN_WEAPON, "weapons/spredgun.wav", 1, ATTN_NORM);
  435.  
  436.     self.punchangle_x = -2;
  437.  
  438.         missile1 = spawn ();
  439.         missile1.owner = self;
  440.         missile1.movetype = MOVETYPE_FLYMISSILE;
  441.         missile1.solid = SOLID_BBOX;
  442.  
  443.         missile2 = spawn ();
  444.         missile2.owner = self;
  445.         missile2.movetype = MOVETYPE_FLYMISSILE;
  446.         missile2.solid = SOLID_BBOX;
  447.  
  448.         missile3 = spawn ();
  449.         missile3.owner = self;
  450.         missile3.movetype = MOVETYPE_FLYMISSILE;
  451.         missile3.solid = SOLID_BBOX;
  452.  
  453.         missile4 = spawn ();
  454.         missile4.owner = self;
  455.         missile4.movetype = MOVETYPE_FLYMISSILE;
  456.         missile4.solid = SOLID_BBOX;
  457.  
  458.         missile5 = spawn ();
  459.         missile5.owner = self;
  460.         missile5.movetype = MOVETYPE_FLYMISSILE;
  461.         missile5.solid = SOLID_BBOX;
  462.  
  463. // set missile speed 
  464.  
  465.         makevectors (self.v_angle);
  466.         missile1.velocity = aim(self, 1000);
  467.         missile1.velocity = missile1.velocity * 1000;  
  468.         missile1.angles = vectoangles(missile1.velocity);
  469.         missile1.touch = T_HomeSpreadTouch;
  470.  
  471.         makevectors (self.v_angle + '0 11 0');
  472.         missile2.velocity = aim(self, 1000);
  473.         missile2.velocity = missile2.velocity * 1000;  
  474.         missile2.angles = vectoangles(missile2.velocity);
  475.         missile2.touch = T_HomeSpreadTouch;
  476.  
  477.         makevectors (self.v_angle + '0 -11 0');
  478.         missile3.velocity = aim(self, 1000);
  479.         missile3.velocity = missile3.velocity * 1000; 
  480.         missile3.angles = vectoangles(missile3.velocity);
  481.         missile3.touch = T_HomeSpreadTouch;
  482.  
  483.         makevectors (self.v_angle + '0 22 0');
  484.         missile4.velocity = aim(self, 1000);
  485.         missile4.velocity = missile4.velocity * 1000;  
  486.         missile4.angles = vectoangles(missile4.velocity);
  487.         missile4.touch = T_HomeSpreadTouch;
  488.  
  489.         makevectors (self.v_angle + '0 -22 0');
  490.         missile5.velocity = aim(self, 1000);
  491.         missile5.velocity = missile5.velocity * 1000; 
  492.         missile5.angles = vectoangles(missile5.velocity);
  493.         missile5.touch = T_HomeSpreadTouch;
  494.  
  495.  
  496. // set missile duration
  497.         missile1.nextthink = time + 30; // number is # of secs missle lasts
  498.         missile1.think = SUB_Remove;
  499.         missile1.nextthink = time + 0.2;
  500.         missile1.think = HomeThink;
  501.         missile1.enemy = world;
  502.         setmodel (missile1, "progs/spredgun.mdl");
  503.         setsize (missile1, '0 0 0', '0 0 0');     
  504.         setorigin (missile1, self.origin + v_forward*8 + '0 0 16');
  505.  
  506.  
  507.         missile2.nextthink = time + 30; // number is # of secs missle lasts
  508.         missile2.think = SUB_Remove;
  509.         missile2.nextthink = time + 0.2;
  510.         missile2.think = HomeThink;
  511.         missile2.enemy = world;
  512.         setmodel (missile2, "progs/spredgun.mdl");
  513.         setsize (missile2, '0 0 0', '0 0 0');     
  514.         setorigin (missile2, self.origin + v_forward*8 + '0 0 16');//16
  515.  
  516.  
  517.         missile3.nextthink = time + 30; // number is # of secs missle lasts
  518.         missile3.think = SUB_Remove;
  519.         missile3.nextthink = time + 0.2;
  520.         missile3.think = HomeThink;
  521.         missile3.enemy = world;
  522.         setmodel (missile3, "progs/spredgun.mdl");
  523.         setsize (missile3, '0 0 0', '0 0 0');     
  524.         setorigin (missile3, self.origin + v_forward*8 + '0 0 16'); //16
  525.  
  526.         missile4.nextthink = time + 30; // number is # of secs missle lasts
  527.         missile4.think = SUB_Remove;
  528.         missile4.nextthink = time + 0.2;
  529.         missile4.think = HomeThink;
  530.         missile4.enemy = world;
  531.         setmodel (missile4, "progs/spredgun.mdl");
  532.         setsize (missile4, '0 0 0', '0 0 0');     
  533.         setorigin (missile4, self.origin + v_forward*8 + '0 0 16');//16
  534.  
  535.  
  536.         missile5.nextthink = time + 30; // number is # of secs missle lasts
  537.         missile5.think = SUB_Remove;
  538.         missile5.nextthink = time + 0.2;
  539.         missile5.think = HomeThink;
  540.         missile5.enemy = world;
  541.         setmodel (missile5, "progs/spredgun.mdl");
  542.         setsize (missile5, '0 0 0', '0 0 0');     
  543.         setorigin (missile5, self.origin + v_forward*8 + '0 0 16'); //16
  544.  
  545.  
  546. };
  547.  
  548.  
  549.  
  550. /*
  551. ==============================================================================
  552.  
  553. SWITCH CONTROL
  554.  
  555. ==============================================================================
  556. */
  557.  
  558. void() SwitchSpread =
  559. {
  560.         if (self.spredgun == 9){self.spredgun=0;}
  561.  
  562.         if (self.spredgun == 2)
  563.         {
  564.                 self.spredgun = 0;
  565.                 sprint(self, "Rocket Launcher Armed\n");
  566.  
  567.                 self.impulse=7;
  568.                 W_ChangeWeapon();
  569.         }
  570.  
  571.         else if (self.spredgun == 1)
  572.         {
  573.                 self.spredgun = 2;
  574.                 sprint(self, "Homing Spread Gun Armed\n");
  575.  
  576.                 self.impulse=7;
  577.                 W_ChangeWeapon();
  578.         }
  579.  
  580.         else if (self.spredgun == 0)
  581.         {
  582.                 self.spredgun = 1;
  583.                 sprint(self, "Spread Gun Armed\n");
  584.  
  585.                 self.impulse=7;
  586.                 W_ChangeWeapon();
  587.  
  588.                 self.items = self.items | IT_CELLS;
  589.         }
  590. };
  591.  
  592. void() SwitchDog =
  593. {
  594.         if (self.spredgun == 1){self.spredgun=0;}
  595.         if (self.spredgun == 2){self.spredgun=0;}
  596.  
  597.         if (self.spredgun == 9)
  598.         {
  599.                 self.spredgun = 0;
  600.                 sprint(self, "Rocket Launcher Armed\n");
  601.  
  602.                 self.impulse=7;
  603.                 W_ChangeWeapon();
  604.         }
  605.         else if (self.spredgun == 0)
  606.         {
  607.                 self.spredgun = 9;
  608.                 sprint(self, "Dog Rocket Armed!!!\n");
  609.  
  610.                 self.impulse=7;
  611.                 W_ChangeWeapon();
  612.         }
  613. };
  614.  
  615.  
  616.  
  617.  
  618.  
  619. /*
  620. ==============================================================================
  621.  
  622. HOMING CODE
  623.  
  624. ==============================================================================
  625. */
  626.  
  627.  
  628. entity() HomeFindTarget =
  629. {
  630.     local entity head, selected;
  631.     local float dist;
  632.     dist = 100000;
  633.     selected = world;
  634.     head = findradius(self.origin, 100000);
  635.     while(head)
  636.     {
  637.         if( (head.health > 1) && (head != self) && (head != self.owner) )
  638.         {
  639.             traceline(self.origin,head.origin,TRUE,self);
  640.             if ( (trace_fraction >= 1) && (vlen(head.origin - self.origin) < dist) )
  641.             {
  642.                 selected = head;
  643.                 dist = vlen(head.origin - self.origin);
  644.             }
  645.         }        
  646.         head = head.chain;
  647.     }
  648.     if (selected != world)
  649.     {
  650.                 sprint (self.owner,"Homing in on ");
  651.         if (selected.classname == "player")
  652.         {
  653.             sprint (self.owner,selected.netname);
  654.             sprint (selected,self.owner.netname);
  655.                         sprint (selected," has Let his Puppy Go!!!\n");
  656.         }
  657.         else
  658.             sprint (self.owner,selected.classname);
  659.                 sprint (self.owner,"\n");
  660.         
  661.     }
  662.     return selected;
  663. };
  664.  
  665. void() HomeThink =
  666. {
  667.     local vector dir, vtemp;
  668.  
  669.     if ( !(self.enemy) || (self.enemy == world) || (self.enemy.health < 1) )
  670.         self.enemy = HomeFindTarget();
  671.  
  672.     if (self.enemy != world) // Arr.. don't be taken on da World!
  673.     {
  674.         vtemp = self.enemy.origin + '0 0 10';
  675.         dir = normalize(vtemp - self.origin);
  676.         self.velocity = dir * 250;
  677.         self.angles = vectoangles(self.velocity);
  678.     }
  679.  
  680.     self.nextthink = time + 0.2;
  681.     self.think=HomeThink;
  682. };
  683.